package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.annotation.AutoFill;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.entity.Employee;
import com.sky.enumeration.OperationType;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

//Mapper是持久层,用sql对数据库进行操作
//每一个数据库对应的表,都创建了一个对应的mapper
@Mapper
public interface EmployeeMapper {

    /**
     * 根据用户名查询员工
     * @param username
     * @return
     */
    @Select("select * from employee where username = #{username}")
    Employee getByUsername(String username);
    //在前端页面,你就输入了用户名和密码,然后进行的请求,对应的参数就会传递给getByUsername方法,然后再传递给上面的sql语句进行查询

    /**
     * 插入员工数据
     * 因为是单表的一个新增操作,比较简单,所以就没必要放到sql对应的xml文件中了
     * @param employee
     */
    @Insert("insert into employee(name,username,password,phone,sex,id_number,create_time,update_time,create_user,update_user,status )" +
            "values" +
            "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")
    @AutoFill(value = OperationType.INSERT)   //自定义的切面注解,AutoFillAspect切面类中实现参数自动填充的功能
    //这里是把枚举类中对应的值,即OperationType.INSERT赋给了value
    void insert(Employee employee);
    //需要注意上面的sql语句中,在数据库的employee表中,字段名是用下划线命名的,如id_number;
    // 而对应后端实体类属性是驼峰命名法,即idNumber;
    //在application.yml配置文件中开启了驼峰命名法,所以这两个是能关联上的

    /**
     * 分页查询----
     * 因为这里要使用到动态sql,这个分页查询,就不直接用注解的方式实现了; 要写到对应的映射文件中去EmployeeMapper.xml中
     * EmployeeMapper.xml  在sky-server对应的resources/mapper的目录下
     * @param employeePageQueryDTO
     * @return
     */
    Page<Employee> pageQuery(EmployeePageQueryDTO employeePageQueryDTO);
    //因为框架底层有mybatis插件,所以上面这个pageQuery爆红的情况下,可以直接快速生成对应的sql语句,不用手动编写
    // 可以直接alt+回车,然后再回车,就能直接选取要生成的sql语句框架,,可以到EmployeeMapper.xml中查看
    //这里是查询,所以选择select语句

    /**
     * 根据我们的主键来动态修改属性
     * 原本只是想根据id,来修改对应的status字段;然后老师设计成了动态修改,可以根据传入参数,动态修改多个参数字段
     *  因为是动态语句,,所以就不直接在当前方法用注解简单的方式编写sql语句了,,要放入到EmployeeMapper.xml中编写
     * @param employee
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Employee employee);

    /**
     * 根据id来查询员工信息:用于对话框的数据回显
     * @param id
     * @return
     */
    //这个sql语句比较简单,不是动态查找,所以可以直接通过@Select注解实现就行
    @Select("select * from employee where id = #{id}")
    Employee getById(Long id);

}
